// 引入ASP.NET Core MVC命名空间
using Microsoft.AspNetCore.Mvc;
// 引入数据访问层命名空间
using RestfulApi.Data;
// 引入模型命名空间
using RestfulApi.Models;

// 定义控制器命名空间
namespace RestfulApi.Controllers
{
    // 定义API路由前缀为"api/Products"
    [Route("api/[controller]/[action]")]
    // 标记为API控制器，启用API特定行为
    [ApiController]
    // 产品控制器类，继承自ControllerBase基类
    public class ProductsController : ControllerBase
    {
        // 声明产品仓储私有字段
        private readonly ProductRepository _repository;

        // 控制器构造函数，初始化仓储对象
        public ProductsController()
        {
            // 实例化产品仓储
            _repository = new ProductRepository();
        }

        // GET: api/Products - 获取所有产品
        [HttpGet]
        // 返回产品集合的操作方法
        public ActionResult<IEnumerable<Product>> GetProducts()
        {
            // 返回HTTP 200 OK状态码和所有产品数据
            return Ok(_repository.GetAll());
        }

        // GET: api/Products/5 - 获取指定ID的产品
        [HttpGet("{id}")]
        // 返回单个产品的操作方法
        // 参数 id: 要获取的产品ID
        public ActionResult<Product> GetProduct(int id)
        {
            // 从仓储中获取指定ID的产品
            var product = _repository.GetById(id);

            // 如果产品不存在，返回404 Not Found状态码
            if (product == null)
            {
                return NotFound();
            }

            // 返回HTTP 200 OK状态码和产品数据
            return Ok(product);
        }

        [HttpPost("postArray")]
        public string PostArray(List<Product> products)
        {
            return "OK";
        }

        // POST: api/Products - 创建新产品
        [HttpPost]
        // 创建产品的操作方法
        // 参数 product: 要创建的产品对象(从请求体获取)
        public ActionResult<Product> CreateProduct(Product product)
        {
            // 如果请求体为空，返回400 Bad Request状态码
            if (product == null)
            {
                return BadRequest();
            }

            // 添加产品到仓储并获取创建后的产品(包含新ID)
            var createdProduct = _repository.Add(product);
            
            // 返回201 Created状态码，包含新创建资源的位置和数据
            return CreatedAtAction(nameof(GetProduct), new { id = createdProduct.Id }, createdProduct);
        }

        // PUT: api/Products/5 - 更新指定ID的产品
        [HttpPut("{id}")]
        // 更新产品的操作方法
        // 参数 id: 路由中的产品ID
        // 参数 product: 更新后的产品对象(从请求体获取)
        public IActionResult UpdateProduct(int id, Product product)
        {
            // 如果路由ID与产品ID不匹配，返回400 Bad Request状态码
            if (id != product.Id)
            {
                return BadRequest();
            }

            // 尝试更新产品并获取操作结果
            var success = _repository.Update(product);
            
            // 如果产品不存在，返回404 Not Found状态码
            if (!success)
            {
                return NotFound();
            }

            // 更新成功，返回204 No Content状态码
            return NoContent();
        }

        // DELETE: api/Products/5 - 删除指定ID的产品
        [HttpDelete("{id}")]
        // 删除产品的操作方法
        // 参数 id: 要删除的产品ID
        public IActionResult DeleteProduct(int id)
        {
            // 尝试删除产品并获取操作结果
            var success = _repository.Delete(id);
            
            // 如果产品不存在，返回404 Not Found状态码
            if (!success)
            {
                return NotFound();
            }

            // 删除成功，返回204 No Content状态码
            return NoContent();
        }
    }
}
